1 module hip.loaders.text;
2 import hip.filesystem.hipfs;
3 import hip.asset_manager.load_task;
4 import hip.assetmanager;
5 import hip.api.data.commons;
6 
7 abstract class HipTextLoadTask : HipAssetLoadTask
8 {
9     abstract string getWorkerName() const;
10     protected abstract HipAsset loadAsset(in ubyte[] data);
11     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
12     {
13         super(path,name,asset,extraData,fileRequesting,lineRequesting);
14     }
15 
16     override void update()
17     {
18         final switch(result) with (HipAssetResult)
19         {
20             case waiting:
21                 result = loading;
22                 worker = HipAssetManager.loadWorker(getWorkerName(), ()
23                 {
24                     HipFS.read(path)
25                     .addOnError((string error){ result = cantLoad; this.error = error; })
26                     .addOnSuccess((in ubyte[] data)
27                     {
28                         asset = loadAsset(data);
29                         result = loaded;
30                         return FileReadResult.keep;
31                     });
32                 });
33                 break;
34             case loading, mainThreadLoading:
35                 break;
36             case loaded: break;
37             case cantLoad: break;
38         }
39     }
40 
41 }
42 
43 final class HipFileLoadTask : HipTextLoadTask
44 {
45     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
46     {
47         super(path,name,asset,extraData,fileRequesting,lineRequesting);
48     }
49     override string getWorkerName() const{ return "Load File"; }
50     override protected HipAsset loadAsset(in ubyte[] data)
51     {
52         HipFileAsset ret = new HipFileAsset(path);
53         ret.load(data);
54         return ret;
55     }
56 }
57 
58 final class HipINILoadTask : HipTextLoadTask
59 {
60     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
61     {
62         super(path,name,asset,extraData,fileRequesting,lineRequesting);
63     }
64     override string getWorkerName() const{ return "Load INI"; }
65     override protected HipAsset loadAsset(in ubyte[] data)
66     {
67         HipINI ret = new HipINI();
68         ret.loadFromMemory(cast(string)data, path);
69         return ret;
70     }
71 }
72 
73 final class HipCSVLoadTask : HipTextLoadTask
74 {
75     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
76     {
77         super(path,name,asset,extraData,fileRequesting,lineRequesting);
78     }
79     override string getWorkerName() const{ return "Load CSV"; }
80     override protected HipAsset loadAsset(in ubyte[] data)
81     {
82         HipCSV ret = new HipCSV();
83         ret.loadFromMemory(cast(string)data, ',', '"', path);
84         return ret;
85     }
86 }
87 
88 final class HipJSONCLoadTask : HipTextLoadTask
89 {
90     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
91     {
92         super(path,name,asset,extraData,fileRequesting,lineRequesting);
93     }
94     override string getWorkerName() const{ return "Load JSONC"; }
95     override protected HipAsset loadAsset(in ubyte[] data)
96     {
97         HipJSONC ret = new HipJSONC();
98         ret.loadFromMemory(cast(string)data, path);
99         return ret;
100     }
101 }
102 
103 final class HipInputMapLoadTask : HipTextLoadTask
104 {
105     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
106     {
107         super(path,name,asset,extraData,fileRequesting,lineRequesting);
108     }
109     override string getWorkerName() const{ return "Load InputMap"; }
110     override protected HipAsset loadAsset(in ubyte[] data)
111     {
112         import hip.assets.inputmap;
113         return cast(HipAsset)HipInputMap.parseInputMap(data, path);
114     }
115 }